﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Manager.App_Code;
using Manager.Common;
using Manager.ViewModels;
using System.Linq;

namespace Manager.FormAdd_Edit
{
    public partial class frm_DKKhachDoan : DevExpress.XtraEditors.XtraForm
    {
        NewPearl_HotelDataContext db = new NewPearl_HotelDataContext();        
        List<PhieuDangKyPhong> lstPhieuDangKyNhom = null;
        List<DangKyPhongViewModel> lstDangKyPhong = null;
        NhomKhachDatPhong nhomKhachDatPhong = null;
        PhieuDatPhong phieuDatPhong = null;
        NhomKhach nhomKhach = null;
        string action = "new";
        
        public frm_DKKhachDoan()
        {
            InitializeComponent();
        }

        public frm_DKKhachDoan(NhomKhachDatPhong _NhomKhach)
        {
            InitializeComponent();
            nhomKhachDatPhong = db.NhomKhachDatPhongs.SingleOrDefault(t => t.MaNhomKhach == _NhomKhach.MaNhomKhach);
        }

        private void frm_DKKhachDoan_Load(object sender, EventArgs e)
        {
            lstPhieuDangKyNhom = new List<PhieuDangKyPhong>();
            lstDangKyPhong = new List<DangKyPhongViewModel>();
            txtGioVao.Text = DateTime.Now.ToString("HH:mm");
            txtMaNhom.Focus();
            btnCapNhat.Enabled = false;
            nhomKhach = db.NhomKhaches.SingleOrDefault(i => i.MaNhomKhach == (int)CommonEnum.NhomKhachHang.KhachTheoNhom_4);

            cmbTienTe.DataSource = db.TienTes.ToList();
            cmbTienTe.DisplayMember = "TenDonVi";
            cmbTienTe.ValueMember = "MaDonVi";

            cmbQuocGia.DataSource = db.QuocGias.ToList();
            cmbQuocGia.DisplayMember = "TenQuocGia";
            cmbQuocGia.ValueMember = "MaQuocGia";

            comNgoaiTe.DataSource = db.TienTes.ToList();
            comNgoaiTe.DisplayMember = "TenDonVi";
            comNgoaiTe.ValueMember = "MaDonVi";

            //Đăng ký mới
            if (nhomKhachDatPhong == null)
            {
                long maxId = 0;
                if (db.NhomKhachDatPhongs.Count() > 0)
                    maxId = db.NhomKhachDatPhongs.Max(i => i.MaNhomKhach);
                txtMaNhom.Text = (maxId + 1).ToString();
                dateNgayDen.Text = DateTime.Now.ToShortDateString();
                dateNgayDi.Text = DateTime.Now.AddDays(1).ToShortDateString();
                dateNgayTao.Text = DateTime.Now.ToShortDateString();
            }
            else //chuyển từ đặt phòng sang đăng ký phòng
            {
                txtMaNhom.Text = nhomKhachDatPhong.MaNhomKhach.ToString();
                txtTenNhom.Text = nhomKhachDatPhong.TenNhomKhach;
                dateNgayDen.DateTime = nhomKhachDatPhong.NgayDen.Value;
                dateNgayDi.DateTime = nhomKhachDatPhong.NgayDi.Value;
                dateNgayTao.DateTime = DateTime.Now;
                phieuDatPhong = db.PhieuDatPhongs.SingleOrDefault(t => t.MaNhomKhach == nhomKhachDatPhong.MaNhomKhach);
                if (phieuDatPhong != null)
                {                    
                    var khachHang = new KhachHang();
                    khachHang.NgayTao = DateTime.Now;
                    khachHang.TenKH = phieuDatPhong.TenKhach;
                    khachHang.MaNhomKhach = nhomKhach.MaNhomKhach;
                    khachHang.SoTaiKhoan = phieuDatPhong.SoTaiKhoan;
                    khachHang.HanTaiKHoan = phieuDatPhong.HanTaiKhoan == DateTime.MinValue ? null : phieuDatPhong.HanTaiKhoan;
                    khachHang.CMND = phieuDatPhong.CMND;
                    khachHang.Passport = phieuDatPhong.Passport;
                    khachHang.DienThoai = phieuDatPhong.LienHe;
                    var quocGia = cmbQuocGia.SelectedItem as QuocGia;
                    khachHang.QuocTich = phieuDatPhong.QuocTich;
                    khachHang.DiaChi = phieuDatPhong.Diachi;
                    var soNgayO = (phieuDatPhong.NgayDi.Value - phieuDatPhong.NgayDen.Value).Days;
                    if (soNgayO <= 0)
                        soNgayO = 1;
                    khachHang.SoNgayO = khachHang.SoNgayO == null ? soNgayO : khachHang.SoNgayO + soNgayO;
                    db.KhachHangs.InsertOnSubmit(khachHang);
                    var dateNow = CommonFunction.ParseLong(DateTime.Now.ToString("ddMMyyyhhmmss"));

                    foreach (var chiTiet in phieuDatPhong.ChiTietPhieuDatPhongs)
                    {                        
                        foreach (var ct_ct in chiTiet.ChiTiet_ChiTietPhieuDatPhongs)
                        {
                            #region add lstDangKyPhong
                            var vmPhieuDangKyPhong = new DangKyPhongViewModel();
                            vmPhieuDangKyPhong.dateNgayDen = phieuDatPhong.NgayDen.Value;
                            vmPhieuDangKyPhong.dateNgayDi = phieuDatPhong.NgayDi.Value;
                            vmPhieuDangKyPhong.MaPhieuDat = dateNow.ToString();
                            vmPhieuDangKyPhong.NgayDen = vmPhieuDangKyPhong.dateNgayDen.ToString("dd/MM/yyyy");
                            vmPhieuDangKyPhong.NgayDi = vmPhieuDangKyPhong.dateNgayDi.ToString("dd/MM/yyyy");
                            vmPhieuDangKyPhong.TienCoc = phieuDatPhong.TienCoc.Value;
                            vmPhieuDangKyPhong.strTienCoc = CommonFunction.AddSeparator(vmPhieuDangKyPhong.TienCoc);
                            vmPhieuDangKyPhong.TienCoc_DonViTienTe = phieuDatPhong.DonViTienTe;
                            vmPhieuDangKyPhong.TenLoaiPhong = chiTiet.LoaiPhong.TenLoaiPhong;
                            vmPhieuDangKyPhong.TenKhachHang = phieuDatPhong.TenKhach;
                            vmPhieuDangKyPhong.SoNguoi = chiTiet.LoaiPhong.SoNguoi.Value.ToString();
                            vmPhieuDangKyPhong.GiaPhong = chiTiet.GiaPhong.Value;
                            vmPhieuDangKyPhong.strGiaPhong = CommonFunction.AddSeparator(chiTiet.GiaPhong.Value);
                            vmPhieuDangKyPhong.GiaPhong_DonViTienTe = chiTiet.MaTienTe;
                            vmPhieuDangKyPhong.MaPhong = ct_ct.MaPhong;

                            lstDangKyPhong.Add(vmPhieuDangKyPhong);
                            #endregion

                            #region add lstPhieuDangKyNhom
                            PhieuDangKyPhong phieuDangKyPhong = new PhieuDangKyPhong();
                            phieuDangKyPhong.MaPhieu = dateNow;
                            phieuDangKyPhong.NhomKhachDatPhong = nhomKhachDatPhong;
                            phieuDangKyPhong.NgayDen = vmPhieuDangKyPhong.dateNgayDen;
                            phieuDangKyPhong.NgayDi = vmPhieuDangKyPhong.dateNgayDi;
                            phieuDangKyPhong.NgayDat = DateTime.Now;
                            phieuDangKyPhong.GhiChu = "";
                            phieuDangKyPhong.SoNguoi = CommonFunction.ParseInt(vmPhieuDangKyPhong.SoNguoi);
                            phieuDangKyPhong.GioVao = txtGioVao.Text.Split(':')[0];
                            phieuDangKyPhong.PhutVao = txtGioVao.Text.Split(':')[1];
                            phieuDangKyPhong.TraTruoc = vmPhieuDangKyPhong.TienCoc;
                            var tienTe = db.TienTes.Single(t => t.MaDonVi == vmPhieuDangKyPhong.TienCoc_DonViTienTe);
                            //phieuDangKyPhong.TienTe = vmPhieuDangKyPhong.TienCoc_DonViTienTe;
                            phieuDangKyPhong.TienTe1 = tienTe;
                            phieuDangKyPhong.TinhTrang = false;                            
                            phieuDangKyPhong.KhachHang = khachHang;

                            var chiTietPhieuDangKy = new ChiTietPhieuDangKy();
                            chiTietPhieuDangKy.KhachHang = khachHang;
                            chiTietPhieuDangKy.MaPhong = vmPhieuDangKyPhong.MaPhong;
                            chiTietPhieuDangKy.MaPhieuDangKy = phieuDangKyPhong.MaPhieu;
                            chiTietPhieuDangKy.GiaPhong = vmPhieuDangKyPhong.GiaPhong;
                            chiTietPhieuDangKy.MaTienTe = vmPhieuDangKyPhong.GiaPhong_DonViTienTe;
                            phieuDangKyPhong.ChiTietPhieuDangKy = chiTietPhieuDangKy;

                            lstPhieuDangKyNhom.Add(phieuDangKyPhong);
                            
                            #endregion

                            dateNow++;
                        }
                    }                    
                }
                gridPhongDangKy.DataSource = null;
                gridPhongDangKy.DataSource = lstDangKyPhong;
                btnCapNhat.Enabled = true;
            }
        }
        
        private void xtraTabThongTinKhachNhom_SelectedPageChanged(object sender, DevExpress.XtraTab.TabPageChangedEventArgs e)
        {
            if (txtTenNhom.Text == "" && xTabDangKyKhachDoan.SelectedTabPage == tabThongTinDangKy)
            {
                MessageBox.Show("Vui lòng nhập tên nhóm!");
                xTabDangKyKhachDoan.SelectedTabPage = tabThongTinKhachNhom;
                return;
            }
        }

        public void LoadTabThongTinDangKy(DangKyPhongViewModel dangKyPhong = null)
        {            
            if (dangKyPhong == null)
            {
                #region dk moi
                var lstQuocGia = db.QuocGias.Where(i => i.MaQuocGia == "VNM").ToList();
                if (lstQuocGia.Count > 0)
                {
                    cmbQuocGia.SelectedItem = lstQuocGia.First();
                }                
                long maxID = 0;
                if (db.KhachHangs.Count() > 0)
                    maxID = db.KhachHangs.Max(i => i.MaKH);
                txtMaKhachHang.Text = (maxID + 1).ToString();
                txtMaĐK.Text = DateTime.Now.ToString("ddMMyyyhhmmss");
                txtMaPhong.Text = "";
                txtTien.Text = "";
                txtSoKhach.Text = "";
                txtHoTen.Text = "";
                txtID.Text = "";
                cmbLoaiID.SelectedIndex = 0;
                txtDiaChi.Text = "";
                txtSoTaiKhoan.Text = "";
                txtTraTruoc.Text = "0";
                txtMaQuocGia.Text = "";
                dateHanTaiKhoan.Text = "";
                txtGhiChu.Text = "";
                txtDienThoai.Text = "";
                #endregion
            }
            else
            {
                var maPhieu = CommonFunction.ParseLong(dangKyPhong.MaPhieuDat);
                var phieuDangKy = lstPhieuDangKyNhom.SingleOrDefault(t => t.MaPhieu == maPhieu);
                if (phieuDangKy != null)
                {
                    #region load lai
                    txtMaĐK.Text = phieuDangKy.MaPhieu.ToString();
                    txtSoKhach.Text = phieuDangKy.SoNguoi == null ? "" : phieuDangKy.SoNguoi.ToString();
                    var khachHang = phieuDangKy.ChiTietPhieuDangKy.KhachHang;
                    txtMaKhachHang.Text = phieuDangKy.MaKhachHang.ToString();
                    txtHoTen.Text = khachHang.TenKH;
                    txtSoTaiKhoan.Text = khachHang.SoTaiKhoan;
                    txtTraTruoc.Text = phieuDangKy.TraTruoc == null ? "0" : CommonFunction.AddSeparator(phieuDangKy.TraTruoc.Value);
                    cmbTienTe.SelectedValue = phieuDangKy.TienTe;
                    dateHanTaiKhoan.Text = khachHang.HanTaiKHoan == null ? "" : khachHang.HanTaiKHoan.Value.ToShortDateString();
                    if (!string.IsNullOrEmpty(khachHang.CMND))
                    {
                        cmbLoaiID.SelectedIndex = 0;
                        txtID.Text = khachHang.CMND;
                    }
                    else if (!string.IsNullOrEmpty(khachHang.Passport))
                    {
                        cmbLoaiID.SelectedIndex = 1;
                        txtID.Text = khachHang.Passport;
                    }
                    txtDienThoai.Text = khachHang.DienThoai;
                    txtMaQuocGia.Text = khachHang.QuocTich;
                    cmbQuocGia.SelectedValue = khachHang.QuocTich;
                    txtDiaChi.Text = khachHang.DiaChi; ;
                    if (khachHang.Nu != null)
                    {
                        ckNu.Checked = true;
                    }
                    else
                        ckNam.Checked = true;
                    txtGhiChu.Text = phieuDangKy.GhiChu;
                    var phong = db.Phongs.SingleOrDefault(i => i.MaPhong == phieuDangKy.ChiTietPhieuDangKy.MaPhong);
                    if (phong != null)
                    {
                        txtMaPhong.Text = phong.MaPhong;
                        comNgoaiTe.SelectedItem = phong.LoaiPhong1.TienTe;

                        txtTien.Text = phong.LoaiPhong1.GiaPhong.ToString();
                        txtSoKhach.Text = phong.LoaiPhong1.SoNguoi.ToString() + "";
                    }
                    #endregion
                    
                    var dkp = lstDangKyPhong.SingleOrDefault(t => t.MaPhieuDat == phieuDangKy.MaPhieu.ToString());
                    //lstPhieuDangKyNhom.Remove(phieuDangKy);
                    lstDangKyPhong.Remove(dkp);
                }
            }
        }        

        private int Validate()
        {
            int flag = 0;
            if (dateNgayDen.Text == "")
            {
                dxErrorProvider1.SetError(dateNgayDen, "Vui lòng chọn Ngày đến");
                flag = 1;
            }
            if (dateNgayDi.Text == "")
            {
                dxErrorProvider1.SetError(dateNgayDi, "Vui lòng chọn Ngày đi");
                flag = 1;
            }            
            return flag;
        }        

        private void butLoadRoom_Click(object sender, EventArgs e)
        {
            var lstMaPhong = new List<string>();
            foreach (var phieudk in lstDangKyPhong)
            {
                lstMaPhong.Add(phieudk.MaPhong);
            }
            Frm_ListRoom listRoom = new Frm_ListRoom(lstMaPhong);
            listRoom.FormClosed += new FormClosedEventHandler(listRoom_FormClosed);
            listRoom.ShowDialog();
        }

        void listRoom_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                var lstRoom = (Frm_ListRoom)sender;
                txtMaPhong.Text = lstRoom.phong.MaPhong;
                txtTien.Text = lstRoom.phong.LoaiPhong1.GiaPhong.ToString();
                txtSoKhach.Text = lstRoom.phong.LoaiPhong1.SoNguoi.Value.ToString() + "";
                comNgoaiTe.SelectedValue = lstRoom.phong.LoaiPhong1.TienTe.MaDonVi;
            }
            catch (Exception ex)
            {
                Log.WriteLog("listRoom_FormClosed: " + ex.Message + "\n" + ex.StackTrace);
            }
        }

        private void btnCapNhap_Click(object sender, EventArgs e)
        {            
            try
            {
                if (Validate() == 0)
                {
                    dxErrorProvider1.ClearErrors();
                }
                else
                {
                    MessageBox.Show("Có lỗi xảy ra!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                // So sánh ngày đến và ngày đi
                if (dateNgayDi.DateTime < dateNgayDen.DateTime)
                {
                    MessageBox.Show("Ngày đi phải lớn hơn hoặc bằng Ngày đến!", "Thông báo");
                    dateNgayDi.Focus();
                    return;
                }

                //update nhom khach dat phong
                if (nhomKhachDatPhong == null)
                {
                    nhomKhachDatPhong = new NhomKhachDatPhong();
                    nhomKhachDatPhong.MaNhomKhach = CommonFunction.ParseInt(txtMaNhom.Text);
                    nhomKhachDatPhong.TenNhomKhach = txtTenNhom.Text;
                    nhomKhachDatPhong.NgayDen = dateNgayDen.DateTime;
                    nhomKhachDatPhong.NgayDi = dateNgayDi.DateTime;
                    nhomKhachDatPhong.GhiChu = txtGhiChuNhomKhach.Text;
                    nhomKhachDatPhong.PhieuDangKyPhongs.AddRange(lstPhieuDangKyNhom);
                    db.NhomKhachDatPhongs.InsertOnSubmit(nhomKhachDatPhong);
                }
                //db.PhieuDangKyPhongs.InsertAllOnSubmit(lstPhieuDangKyNhom);
                //update tinh trang phong
                foreach (var pdk in lstPhieuDangKyNhom)
                {                    
                    var phong = db.Phongs.SingleOrDefault(i => i.MaPhong == pdk.ChiTietPhieuDangKy.MaPhong);
                    phong.TinhTrang = ((int)(CommonEnum.TinhTrangPhong.CoKhach_3)).ToString();
                }

                //if (phieuDatPhong != null)
                //{
                //    var lstChiTietPhieuDat = phieuDatPhong.ChiTietPhieuDatPhongs.ToList();
                //    foreach (var ctpd in lstChiTietPhieuDat)
                //    {                        
                //        db.ChiTiet_ChiTietPhieuDatPhongs.DeleteAllOnSubmit(ctpd.ChiTiet_ChiTietPhieuDatPhongs.ToList());
                //    }
                //    db.ChiTietPhieuDatPhongs.DeleteAllOnSubmit(lstChiTietPhieuDat);
                //    db.PhieuDatPhongs.DeleteOnSubmit(phieuDatPhong);
                //}
                db.PhieuDangKyPhongs.InsertAllOnSubmit(lstPhieuDangKyNhom);
                db.SubmitChanges();
                MessageBox.Show("Cập nhật thành công.");
                this.Close();
            }
            catch (Exception ex)
            {
                Log.WriteLog("frm_DKKhachDoan:btnCapNhap_Click " + ex.Message + "\n" + ex.StackTrace);
                MessageBox.Show(ex.Message);
            }
        }        
    
        private void btnThem_Click(object sender, EventArgs e)
        {
            action = "new";
            if (txtTenNhom.Text == "")
            {
                MessageBox.Show("Vui lòng nhập tên nhóm!");
            }
            else
            {
                LoadTabThongTinDangKy();
                xTabDangKyKhachDoan.SelectedTabPage = tabThongTinDangKy;
            }
        }

        private void txtID_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;                
            }
        }

        private void txtDienThoai_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void btnESC_Click(object sender, EventArgs e)
        {
            this.Close();
        }        

        private void btnCapNhapThongTin_Click(object sender, EventArgs e)
        {
            if (txtMaPhong.Text == "")
            {
                MessageBox.Show("Vui lòng chọn phòng.");
                return;
            }
            if(txtHoTen.Text=="")
            {
                MessageBox.Show("Vui điền tên khách hàng.");
                return;
            }
            if (action == "new")
            {
                if (lstPhieuDangKyNhom.Count > 0)
                {
                    var phieuDK = lstPhieuDangKyNhom.SingleOrDefault(t => t.ChiTietPhieuDangKy.MaPhong == txtMaPhong.Text);
                    if (phieuDK != null)
                    {
                        MessageBox.Show("Phòng này đã được đặt rồi vui lòng chọn phòng khác.");
                        return;
                    }
                }
            }
            Insert();
            gridPhongDangKy.DataSource = null;
            gridPhongDangKy.DataSource = lstDangKyPhong;
            xTabDangKyKhachDoan.SelectedTabPage = tabThongTinKhachNhom;
            btnCapNhat.Enabled = true;
            btnCapNhat.Focus();
        }

        private void btnTimKiem_Click(object sender, EventArgs e)
        {
            frm_SearchCustomer searchCustomer = new frm_SearchCustomer();
            searchCustomer.FormClosed += new FormClosedEventHandler(searchCustomer_FormClosed);
            searchCustomer.ShowDialog();
        }

        void searchCustomer_FormClosed(object sender, FormClosedEventArgs e)
        {
            var frm = sender as frm_SearchCustomer;
            if (frm.khachHang != null)
            {
                var kh = frm.khachHang;
                txtMaKhachHang.Text = kh.MaKH.ToString();
                txtHoTen.Text = kh.TenKH;
                txtSoTaiKhoan.Text = kh.SoTaiKhoan;
                dateHanTaiKhoan.Text = kh.HanTaiKHoan == null ? "" : kh.HanTaiKHoan.Value.ToShortDateString();                
                if (!string.IsNullOrEmpty(kh.CMND))
                {
                    cmbLoaiID.SelectedIndex = 0;
                    txtID.Text = kh.CMND;
                }
                else if (!string.IsNullOrEmpty(kh.Passport))
                {
                    cmbLoaiID.SelectedIndex = 1;
                    txtID.Text = kh.Passport;
                }
                txtDienThoai.Text = kh.DienThoai;
                cmbQuocGia.SelectedValue = kh.QuocGia.MaQuocGia;
                txtDiaChi.Text = kh.DiaChi; ;
                if (kh.Nu.Value)
                {
                    ckNu.Checked = true;
                }
                else
                    ckNam.Checked = true;
            }
        }

        private void Insert()
        {
            var maPhieu = CommonFunction.ParseLong(txtMaĐK.Text);
            var flag = true;
            var phieuDangKyNhom = lstPhieuDangKyNhom.SingleOrDefault(t => t.MaPhieu == maPhieu);
            if (phieuDangKyNhom == null)
            {
                phieuDangKyNhom = new PhieuDangKyPhong();
                flag = false;
            }
            GenaratePhieuDangKy(phieuDangKyNhom, flag);

            //add List DangKyPhong            
            var dangKyPhong = new DangKyPhongViewModel();
            dangKyPhong.MaPhieuDat = phieuDangKyNhom.MaPhieu.ToString();
            dangKyPhong.MaPhong = txtMaPhong.Text;
            dangKyPhong.TenKhachHang = txtHoTen.Text;
            dangKyPhong.NgayDen = dateNgayDen.DateTime.ToShortDateString();
            dangKyPhong.NgayDi = dateNgayDi.DateTime.ToShortDateString();
            dangKyPhong.SoNguoi = txtSoKhach.Text;
            lstDangKyPhong.Add(dangKyPhong);

            //add list PhieuDangKyNhom
            if (!flag)
                lstPhieuDangKyNhom.Add(phieuDangKyNhom);
        }

        private void GenaratePhieuDangKy(PhieuDangKyPhong phieuDangKyNhom, bool flag)
        {
            phieuDangKyNhom.MaPhieu = long.Parse(txtMaĐK.Text);
            phieuDangKyNhom.NhomKhachDatPhong = db.NhomKhachDatPhongs.SingleOrDefault(i => i.MaNhomKhach == CommonFunction.ParseInt(txtMaNhom.Text));
            phieuDangKyNhom.NgayDen = dateNgayDen.DateTime;
            phieuDangKyNhom.NgayDi = dateNgayDi.DateTime;
            phieuDangKyNhom.NgayDat = dateNgayTao.DateTime;
            phieuDangKyNhom.GhiChu = txtGhiChu.Text;
            phieuDangKyNhom.SoNguoi = CommonFunction.ParseInt(txtSoKhach.Text);
            phieuDangKyNhom.GioVao = txtGioVao.Text.Split(':')[0];
            phieuDangKyNhom.PhutVao = txtGioVao.Text.Split(':')[1];
            phieuDangKyNhom.TraTruoc = CommonFunction.ParseDouble(txtTraTruoc.Text);
            phieuDangKyNhom.TienTe = cmbTienTe.SelectedValue.ToString();
            phieuDangKyNhom.NguoiDung = Variables.NguoiDung.Username;
            phieuDangKyNhom.TinhTrang = false;

            KhachHang khachHang = null;
            if (!flag)
            {
                if (cmbLoaiID.SelectedIndex == 0)
                    khachHang = db.KhachHangs.SingleOrDefault(t => t.CMND == txtID.Text);
                else
                    khachHang = db.KhachHangs.SingleOrDefault(t => t.Passport == txtID.Text);
                if (khachHang == null)
                    khachHang = new KhachHang();
            }
            else
                khachHang = phieuDangKyNhom.ChiTietPhieuDangKy.KhachHang;
            khachHang.TenKH = txtHoTen.Text;
            khachHang.MaNhomKhach = nhomKhach.MaNhomKhach;
            khachHang.SoTaiKhoan = txtSoTaiKhoan.Text;
            if (dateHanTaiKhoan.Text != "")
                khachHang.HanTaiKHoan = dateHanTaiKhoan.DateTime;
            if (cmbLoaiID.SelectedIndex == 0)
            {
                khachHang.Passport = "";
                khachHang.CMND = txtID.Text;
            }
            else
            {
                khachHang.CMND = "";
                khachHang.Passport = txtID.Text;
            }
            khachHang.DienThoai = txtDienThoai.Text;
            khachHang.NgayTao = DateTime.Now;
            var quocGia = cmbQuocGia.SelectedItem as QuocGia;
            khachHang.QuocTich = quocGia.MaQuocGia;
            khachHang.DiaChi = txtDiaChi.Text;
            if (ckNam.Checked)
                khachHang.Nu = false;
            else
                khachHang.Nu = true;
            var soNgayO = (dateNgayDi.DateTime - dateNgayDen.DateTime).Days;
            if (soNgayO <= 0)
                soNgayO = 1;
            khachHang.SoNgayO = khachHang.SoNgayO == null ? soNgayO : khachHang.SoNgayO + soNgayO;
            phieuDangKyNhom.KhachHang = khachHang;

            ChiTietPhieuDangKy chiTietPhieuDangKy = null;
            if (!flag)
                chiTietPhieuDangKy = new ChiTietPhieuDangKy();
            else
                chiTietPhieuDangKy = phieuDangKyNhom.ChiTietPhieuDangKy;
            chiTietPhieuDangKy.KhachHang = khachHang;
            chiTietPhieuDangKy.MaPhong = txtMaPhong.Text;
            chiTietPhieuDangKy.MaPhieuDangKy = phieuDangKyNhom.MaPhieu;
            chiTietPhieuDangKy.KhachHang = khachHang;
            chiTietPhieuDangKy.GiaPhong = CommonFunction.ParseDouble(txtTien.Text);
            chiTietPhieuDangKy.TienTe = comNgoaiTe.SelectedItem as TienTe;
            if (!flag)
                phieuDangKyNhom.ChiTietPhieuDangKy = chiTietPhieuDangKy;
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            int index = gvPhongDangKy.FocusedRowHandle;
            var dangKyPhong = gvPhongDangKy.GetRow(index) as DangKyPhongViewModel;
            var maPhieu = CommonFunction.ParseLong(dangKyPhong.MaPhieuDat);
            var phieuDangKy = lstPhieuDangKyNhom.SingleOrDefault(t => t.MaPhieu == maPhieu);
            if (phieuDangKy != null)
            {
                lstPhieuDangKyNhom.Remove(phieuDangKy);                
            }
            var phieudk = lstDangKyPhong.SingleOrDefault(t => t.MaPhieuDat == maPhieu.ToString());
            if (phieudk != null)
            {
                lstDangKyPhong.Remove(phieudk);
                gridPhongDangKy.DataSource = null;
                gridPhongDangKy.DataSource = lstDangKyPhong;
            }
        }

        private void btnHieuChinh_Click(object sender, EventArgs e)
        {
            action = "edit";
            int index = gvPhongDangKy.FocusedRowHandle;
            var dangKyPhong = gvPhongDangKy.GetRow(index) as DangKyPhongViewModel;
            LoadTabThongTinDangKy(dangKyPhong);
            xTabDangKyKhachDoan.SelectedTabPage = tabThongTinDangKy;
        }        

        private void txtMaQuocGia_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                var quocGia = db.QuocGias.SingleOrDefault(t => t.MaQuocGia == (txtMaQuocGia.Text).ToUpper());
                if (quocGia != null)
                    cmbQuocGia.SelectedItem = quocGia;
            }
        }        

        private void txtMaQuocGia_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = Char.ToUpper(e.KeyChar);
        }             
    }
}